home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / clang / fidoadr.zip / FIDOADR.C < prev    next >
C/C++ Source or Header  |  1992-03-07  |  4KB  |  180 lines

  1. /*
  2.  * Functions to convert to and from ASCII fidonet specs and their
  3.  * seperate entities.
  4.  *
  5.  * These are the valid FidoNet address specifictions:
  6.  *
  7.  * zone:net/node.point@domain
  8.  * zone:net/node.point
  9.  * zone:net/node@domain
  10.  * zone:net/node
  11.  * net/node.point@domain
  12.  * net/node.point
  13.  * net/node@domain
  14.  * net/node
  15.  * node.point@domain
  16.  * node.point
  17.  * node@domain
  18.  * node
  19.  */
  20.  
  21.  #include <stdio.h>
  22.  #include <string.h>
  23.  
  24. #include "fidoadr.h"
  25.  
  26. /*
  27.  * Split a fido address into it's seperate parts.  The following are valid
  28.  * fido address specifictions.
  29.  */
  30. void fidoadr_split(char *addr, FIDOADR *fadr)
  31. {
  32.     char *p, *q;
  33.     char st[255];
  34.  
  35.     /*
  36.      * Zone
  37.      */
  38.     p = strchr(addr, ':');
  39.     if (p) fadr->zone = (word) atol(addr);
  40.     else fadr->zone = 0;
  41.     /*
  42.      * Net
  43.      */
  44.     p = strchr(addr, '/');
  45.     if (p) {
  46.         p--;
  47.         while (strchr("0123456789", *p) && (p >= addr)) p--;
  48.         p++;
  49.         fadr->net = (word) atol(p);
  50.     }
  51.     else fadr->net = 0;
  52.     /*
  53.      * Node
  54.      */
  55.     p = strchr(addr, '/');
  56.     if (p) {
  57.         p++;
  58.         fadr->node = (word) atol(p);
  59.     }
  60.     else fadr->node = (word) atol(addr);
  61.     /*
  62.      * Point
  63.      */
  64.     p = strchr(addr, '.');
  65.     if (p) {
  66.         p++;
  67.         fadr->point = (word) atol(p);
  68.     }
  69.     else fadr->point = 0;
  70.     /*
  71.      * Domain
  72.      */
  73.     p = strchr(addr, '@');
  74.     if (p) {
  75.         p++;
  76.         strcpy(fadr->domain, p);
  77.     }
  78.     else *(fadr->domain) = '\0';
  79. }
  80.  
  81. /*
  82.  * Merge the parts specified in FIDOADR into a ASCII fidonet specification
  83.  *
  84.  * Beware of results if you don't pass good values in FIDOADR.
  85.  *
  86.  */
  87. char *fidoadr_merge(char *addr, FIDOADR *fadr)
  88. {
  89.     static char tmp[64];
  90.  
  91.     *addr = '\0';
  92.     if (fadr->zone) {
  93.         ltoa((long)(fadr->zone), tmp, 10);
  94.         strcat(addr, tmp);
  95.         strcat(addr, ":");
  96.     }
  97.     if (fadr->zone || fadr->net) {
  98.         ltoa((long) fadr->net, tmp, 10);
  99.         strcat(addr, tmp);
  100.         strcat(addr, "/");
  101.     }
  102.     ltoa((long) fadr->node, tmp, 10);
  103.     strcat(addr, tmp);
  104.     if (fadr->point && fadr->node) {
  105.         strcat(addr, ".");
  106.         ltoa((long) fadr->point, tmp, 10);
  107.         strcat(addr, tmp);
  108.     }
  109.     if (*(fadr->domain)) {
  110.         strcat(addr, "@");
  111.         strcat(addr, fadr->domain);
  112.     }
  113.     return(addr);
  114. }
  115.  
  116. /*
  117.  * Simple 3-part address to string conversion
  118.  */
  119. char *fidostr(char *dest, word zone, word net, word node)
  120. {
  121.     FIDOADR fadr=DEF_FIDOADR;
  122.  
  123.     fadr.zone = zone;
  124.     fadr.net = net;
  125.     fadr.node = node;
  126.     fidoadr_merge(dest, &fadr);
  127.     return(dest);
  128. }
  129.  
  130. /*
  131.  * Split simple 3-part address
  132.  */
  133. void fidosplit(char *src, word *zone, word *net, word *node)
  134. {
  135.     FIDOADR fadr=DEF_FIDOADR;
  136.  
  137.     fidoadr_split(src, &fadr);
  138.     *zone = fadr.zone;
  139.     *net = fadr.net;
  140.     *node = fadr.node;
  141. }
  142.  
  143. /*
  144.  * Extract an 8 character hex filename net/node spec to numeric net & node
  145.  *
  146.  * "01180133" -> net=280 node=307
  147.  *
  148.  */
  149. void hexadr_split(char *hexadr, word *net, word *node)
  150. {
  151.     char tmp[5];
  152.  
  153.     tmp[4] = '\0';
  154.     /*
  155.      * Net
  156.      */
  157.     strncpy(tmp, hexadr, 4);
  158.     strupr(tmp);
  159.     sscanf(tmp, "%04x", net);
  160.     /*
  161.      * Node
  162.      */
  163.     strncpy(tmp, &(hexadr[4]), 4);
  164.     strupr(tmp);
  165.     sscanf(tmp, "%04x", node);
  166. }
  167.  
  168. /*
  169.  * Merge numeric net & node to an 8 character hex filename
  170.  *
  171.  * net=280 node=307 -> "01180133"
  172.  *
  173.  */
  174. char *hexadr_merge(char *hexadr, word net, word node)
  175. {
  176.     sprintf(hexadr, "%04X%04X", net, node);
  177.     return(hexadr);
  178. }
  179.  
  180.